# makefile for the Hans and Martin project

# Set external model T96, T01, or TS05. The model files are
# linked in accordingly, and the preprocessor generates the appropriate
# calls in the program files.
EXMODEL = T96
#EXMODEL = T01
#EXMODEL = TS05

#PREPROC = GFORTRAN
PREPROC = FPP

ifeq "$(EXMODEL)" "T01"
  DEFINES = -D_T01_ 
  HAMOBJECTS = ham.o Geopack2008.o T01.o weimer2k.o collection.o
else ifeq "$(EXMODEL)" "TS05"
  DEFINES = -D_TS05_ 
  HAMOBJECTS = ham.o Geopack2008.o TS05.o weimer2k.o collection.o
else
  DEFINES = -D_T96_ 
  HAMOBJECTS = ham.o Geopack2008.o T96.o weimer2k.o collection.o
endif

# Names of executable files
HAMTARGET = ham

# Compiler, flags, and preprocessor
#FLIBS		= -L/opt/mpich/lib
FLIBS		= -L$(HOME)/mpich2/lib
FFLAGS		= 
#FXX 		= mpifort
FXX      = $(HOME)/mpich2/bin/mpif90    # fortran compiler to use
FLD		= $(FXX)
LDFLAGS 	= 

MYRUN	   	= mpirun
NCPU 		= $(shell nproc --all)
RFLAGS		= -np $(NCPU)
LR		= $(MYRUN)

ifeq "$(PREPROC)" "GFORTRAN"
  PREPROCESSOR = gfortran -cpp # gfortran preprocessing command
  PREFLAGS     = -C -P -E      # flags for the preprocessor
else ifeq "$(PREPROC)" "FPP"
  PREPROCESSOR = fpp  	       # fpp : intel preprocessor
  PREFLAGS     = -C -P         # flags for the preprocessorO
endif


#------------------------------------------------------------------------
# Make rules
#
all: $(HAMTARGET) 

$(HAMTARGET): $(HAMOBJECTS)
	$(FLD) $(HAMOBJECTS) $(FLDFLAGS) -o $(HAMTARGET) $(FLIBS)


clean:
	rm *.o

delete:
	rm *.o $(HAMTARGET)


# Rule used to generate object files from source code:
%.o: %.f
	$(FXX) $(FFLAGS) -c $<

%.o: %.for
	$(FXX) $(FFLAGS) -c $<

%.o: %.f90
	$(FXX) $(FFLAGS) -c $<

%.o: %.F
	$(FXX) $(FFLAGS) -c $<

%.f90: %.fpp
	$(PREPROCESSOR) $(DEFINES) $(PREFLAGS) $< -o $@
#	$(PREPROCESSOR) $(DEFINES) $(PREFLAGS) $< -o $*.f95

run:
	$(LR) $(RFLAGS) ./$(HAMTARGET)
